from django.core.paginator import Paginator
from django.core.cache import cache

from apps.core.models import Product


class ProductService:
    def __init__(self, product=None):
        """
        初始化服务层
        :param product: 可选的 product 对象，如果需要处理某个特定商品的操作时传入
        """
        self.product = product

    def get_product_by_id(self, product_id):
        """
        根据商品 ID 查询商品库存
        :param product_id: 商品 ID
        :return: 返回商品对象，或 None 如果没有找到
        """
        try:
            product = Product.objects.get(product_id=product_id)
            return product
        except Product.DoesNotExist:
            return None

    def search_products(self, query, page=1, per_page=10):
        """
        根据商品名称查询商品，支持分页
        注意 ： 这里其实可以引用更为完美的elasticSearch等使用搜索的中间件去完成
        :param query: 商品名称的查询关键字
        :param page: 页码
        :param per_page: 每页显示的商品数量
        :return: 分页后的商品列表
        """

        # 从缓存中获取查询结果，避免重复查询
        cache_key = f'product_search_{query}_{page}'
        cached_results = cache.get(cache_key)
        if cached_results:
            return cached_results

        # 模糊查询商品名称
        products = Product.objects.filter(name__icontains=query)
        paginator = Paginator(products, per_page)
        paginated_products = paginator.get_page(page)

        # 将查询结果缓存
        cache.set(cache_key, paginated_products, timeout=60 * 15)  # 缓存 15 分钟
        return paginated_products

